/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlet;

import gestionnaire.gestionnaireAge;
import gestionnaire.gestionnaireCategorie;
import gestionnaire.gestionnaireJeu;
import gestionnaire.gestionnaireTag;
import gestionnaire.gestionnaireUtilisateur;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import modeles.categorie;
import modeles.jeu;
import modeles.panier;
import modeles.tag;
import modeles.utilisateur;

/**
 *
 * @author elo
 */
@WebServlet(name = "ServletAction", urlPatterns = {"/ServletAction"})
public class ServletAction extends HttpServlet {

    @EJB
    private gestionnaireAge gestionnaireAge;
    @EJB
    private gestionnaireTag gestionnaireTag;
    @EJB
    private gestionnaireCategorie gestionnaireCategorie;
    @EJB
    private gestionnaireJeu gestionnaireJeu;
    @EJB
    private gestionnaireUtilisateur gestionnaireUtilisateur;
    //panier
    private ArrayList<panier> panier = new ArrayList<panier>();
    private float totalPanier = 0.0f;

    //ajouter le jeu dans le panier
    public void addToPanier(jeu j){
        Boolean isInPanier = false;
        for (panier p : panier) {
            if(p.getJeu().getId() == j.getId()){
                isInPanier = true;
                p.add();
            }
        }
        if(!isInPanier){
            panier.add(new panier(j, 1));
        }
    }

    //supprimer un jeu du panier (diminuer quantite)
    public void suppToPanier(jeu j){
        int index = -1;
        for (int i=0 ; i<panier.size() ; i++) {
            if(panier.get(i).getJeu().getId() == j.getId()){
                if(panier.get(i).getQuantite() > 1){
                panier.get(i).supp();
                }else{
                    index = i;
                }
            }
        }
        if(index != -1){
            panier.remove(index);
        }
    }

    //supprimer complètement le jeu du panier
    public void suppTotalToPanier(jeu j){
        int index = -1;
        for (int i=0 ; i<panier.size() ; i++) {
            if(panier.get(i).getJeu().getId() == j.getId())
                    index = i;
        }
        if(index != -1)
            panier.remove(index);
    }

    //calculer le nombre de produits présents dans le panier
    public int nbProduitsPanier(){
        int total = 0;
        for (panier p : panier) {
            total += p.getQuantite();
        }
        return total;
    }

    //calculer le prix total du panier
    public float getTotalPanier(){
       float total = 0.0f;
        for (panier p : panier) {
            total += p.getJeu().getPrix() * p.getQuantite();
        }
        return total;
    }

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        // Pratique pour décider de l'action à faire
        HttpSession session = request.getSession(true);
        String action = request.getParameter("action");
        
        System.out.println(new File(".").getAbsolutePath());

        if (action != null) {
            if (action.equals("init")) {
                //remplissage de la bd
                //init categories
                gestionnaireCategorie.creerCategories();
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                //init tag
                gestionnaireTag.creerTags();
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                //init age
                gestionnaireAge.creerAges();
                //init jeux
                gestionnaireJeu.creerJeux();
                Collection<jeu> liste5 = gestionnaireJeu.getMieuxNotes();
                Collection<jeu> liste6 = gestionnaireJeu.getPlusConsultes();
                request.setAttribute("listeDesJeuxMieuxNotes", liste5);
                request.setAttribute("listeDesJeuxPlusConsultes", liste6);
                panier.clear();
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                totalPanier = 0.0f;
                request.setAttribute("totalPanier", totalPanier);
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp");
                dp.forward(request, response);
            } else if (action.equals("detail")) {
                int id = Integer.parseInt(request.getParameter("id"));
                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    request.setAttribute("jeu", j);
                    Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                    request.setAttribute("listeDesCategories", liste);
                    Collection<tag> liste2 = gestionnaireTag.getAllTags();
                    request.setAttribute("listeDesTags", liste2);
                    request.setAttribute("nbArtPanier", nbProduitsPanier());
                    request.setAttribute("totalPanier", totalPanier);
                    //consultation ++;
                    gestionnaireJeu.nouvelleConsultation(j);

                    RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=detail");
                    dp.forward(request, response);
                } else {
                    RequestDispatcher dp = request.getRequestDispatcher("index.jsp");
                    dp.forward(request, response);
                }
            } else if (action.equals("connexion")) {
                String login = request.getParameter("login");
                Boolean admin = Boolean.valueOf(request.getParameter("admin"));
                if(admin)
                    session.setAttribute("admin", true);
                else
                    session.setAttribute("admin", false);
                session.setAttribute("connexion", true);
                session.setAttribute("login", login);

                //remplissage de la bd
                //listes users
                gestionnaireUtilisateur.creerUtilisateurTest();
                //init categories
                gestionnaireCategorie.creerCategories();
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                //init tag
                gestionnaireTag.creerTags();
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                //init age
                gestionnaireAge.creerAges();
                //init jeux
                gestionnaireJeu.creerJeux();
                Collection<jeu> liste5 = gestionnaireJeu.getMieuxNotes();
                Collection<jeu> liste6 = gestionnaireJeu.getPlusConsultes();
                request.setAttribute("listeDesJeuxMieuxNotes", liste5);
                request.setAttribute("listeDesJeuxPlusConsultes", liste6);
                panier.clear();
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                totalPanier = 0.0f;
                request.setAttribute("totalPanier", totalPanier);
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp");
                dp.forward(request, response);
            } else if (action.equals("connexionUser")) {
                String login = request.getParameter("login");
                String mdp = request.getParameter("mdp");
                if (gestionnaireUtilisateur.isUtilisateur(login, mdp)) {
                    response.getWriter().print("ok");
                }else{
                    response.getWriter().print("ko");
                }
            } else if (action.equals("deconnexion")) {
                session.setAttribute("connexion", false);
                session.setAttribute("admin", false);
                session.setAttribute("login", "");
                panier.clear();
                totalPanier = 0.0f;
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp");
                dp.forward(request, response);
            } else if (action.equals("voter")) {
                int id = Integer.parseInt(request.getParameter("id"));
                int note = Integer.parseInt(request.getParameter("note"));

                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    gestionnaireJeu.voter(j, note);
                }
                response.getWriter().print(j.getNote());
            } else if (action.equals("addToPanier")) {
                int id = Integer.parseInt(request.getParameter("id"));
                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    addToPanier(j);
                    totalPanier += j.getPrix();
                    float p10 = (float) Math.pow(10, 2);
                    totalPanier = ((int) (totalPanier * p10)) / p10;
                    String result = nbProduitsPanier()+";"+totalPanier;
                    response.getWriter().print(result);
                }
            } else if (action.equals("quantiteplus")) {
                int id = Integer.parseInt(request.getParameter("id"));
                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    addToPanier(j);
                    totalPanier += j.getPrix();
                    float p10 = (float) Math.pow(10, 2);
                    totalPanier = ((int) (totalPanier * p10)) / p10;
                }
                request.setAttribute("panier", panier);
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=panier");
                dp.forward(request, response);
            } else if (action.equals("quantiteMoins")) {
                int id = Integer.parseInt(request.getParameter("id"));
                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    suppToPanier(j);
                    if (panier.size() > 0) {
                        totalPanier -= j.getPrix();
                        float p10 = (float) Math.pow(10, 2);
                        totalPanier = ((int) (totalPanier * p10)) / p10;
                    } else {
                        totalPanier = 0.0f;
                    }
                    request.setAttribute("panier", panier);
                    Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                    request.setAttribute("listeDesCategories", liste);
                    Collection<tag> liste2 = gestionnaireTag.getAllTags();
                    request.setAttribute("listeDesTags", liste2);
                    request.setAttribute("nbArtPanier", nbProduitsPanier());
                    request.setAttribute("totalPanier", totalPanier);
                }
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=panier");
                dp.forward(request, response);
            }else if(action.equals("suppPanier")){
                int id = Integer.parseInt(request.getParameter("id"));
                jeu j = gestionnaireJeu.getJeuById(id);
                if (j != null) {
                    suppTotalToPanier(j);
                    if (panier.size() > 0) {
                        totalPanier = getTotalPanier();
                        float p10 = (float) Math.pow(10, 2);
                        totalPanier = ((int) (totalPanier * p10)) / p10;
                    } else {
                        totalPanier = 0.0f;
                    }
                    request.setAttribute("panier", panier);
                    Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                    request.setAttribute("listeDesCategories", liste);
                    Collection<tag> liste2 = gestionnaireTag.getAllTags();
                    request.setAttribute("listeDesTags", liste2);
                    request.setAttribute("nbArtPanier", nbProduitsPanier());
                    request.setAttribute("totalPanier", totalPanier);
                }
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=panier");
                dp.forward(request, response);
            } else if (action.equals("panier")) {
                request.setAttribute("panier", panier);
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=panier");
                dp.forward(request, response);
            } else if (action.equals("inscription")) {
                String login = request.getParameter("login");
                String mdp = request.getParameter("mdp");
                utilisateur u = gestionnaireUtilisateur.creeUtilisateur(login, mdp);
            } else if (action.equals("accueil")) {
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                Collection<jeu> liste5 = gestionnaireJeu.getMieuxNotes();
                Collection<jeu> liste6 = gestionnaireJeu.getPlusConsultes();
                request.setAttribute("listeDesJeuxMieuxNotes", liste5);
                request.setAttribute("listeDesJeuxPlusConsultes", liste6);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp");
                dp.forward(request, response);
            } else if (action.equals("categorie")) {
                int id = Integer.parseInt(request.getParameter("id"));
                Collection<jeu> listeJeu = gestionnaireJeu.getJeuxByCat(id);
                request.setAttribute("listeJeux", listeJeu);
                request.setAttribute("nombreElem" , listeJeu.size());
                
                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("titre", gestionnaireCategorie.getNomCategorieById(id));
                
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=jeuxByCat");
                dp.forward(request, response);
            }else if (action.equals("tag")) {
                int id = Integer.parseInt(request.getParameter("id"));
                Collection<jeu> listeJeu = gestionnaireJeu.getJeuxByTag(id);
                request.setAttribute("listeJeux", listeJeu);

                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("titre", gestionnaireTag.getNomTagById(id));

                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=jeuxByCat");
                dp.forward(request, response);          
            }else if (action.equals("resRechercheDetail")) {
                String nomJeu = request.getParameter("nomJeu");
                int idCat = Integer.parseInt(request.getParameter("categorie"));
                int idTag = Integer.parseInt(request.getParameter("tag"));
                String editeur = request.getParameter("editeur");
                int prix = Integer.parseInt(request.getParameter("prix"));
                Collection<jeu> listeJeu = gestionnaireJeu.getJeuxByRechercheDetail(nomJeu, idCat, idTag, editeur, prix);
                request.setAttribute("listeJeux", listeJeu);
                request.setAttribute("nombreElem" , listeJeu.size());

                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("titre", "Recherche détaillée");

                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=jeuxByCat");
                dp.forward(request, response);
            }else if(action.equals("listUser")){
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                Collection<utilisateur> listeUser = gestionnaireUtilisateur.getAllUsers();
                request.setAttribute("listeDesUsers", listeUser);
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=listUser");
                dp.forward(request, response);
            }else if(action.equals("SupprimerUtilisateurList")){
                //supprimer un par un les utilisateurs selectionnes
                String ids = request.getParameter("liste");
                String[] tabid = ids.split("_");
                for(int i=0; i<tabid.length ; i++){
                    gestionnaireUtilisateur.dellUserById(tabid[i]);
                }
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                Collection<utilisateur> listeUser = gestionnaireUtilisateur.getAllUsers();
                request.setAttribute("listeDesUsers", listeUser);
                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=listUser");
                dp.forward(request, response);
            }else if (action.equals("rechercheDetail")) {
                Collection<String> editeur = gestionnaireJeu.getAllEditeurs();
                Collection<tag> listeTag = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", listeTag);

                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("listeAuteurs", editeur);

                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=rechercheDetail");
                dp.forward(request, response);
            }else if(action.equals("rechercheCompletion")){
                Collection<jeu> liste = gestionnaireJeu.getAllJeux();
                String result = "";
                for (jeu j : liste)
                    result += j.getNom() +";";
                response.getWriter().print(result);
            }else if(action.equals("rechercherJeux")){
                String nom = request.getParameter("searchNomJeux");
                int idcat = Integer.parseInt(request.getParameter("categorie"));
                Collection<jeu> listeJeu = gestionnaireJeu.getJeuxByNomCat(nom, idcat);
                request.setAttribute("listeJeux", listeJeu);

                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                Collection<tag> liste2 = gestionnaireTag.getAllTags();
                request.setAttribute("listeDesTags", liste2);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("titre", "Resultat de la recherche");

                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=jeuxByCat");
                dp.forward(request, response);
            }else if(action.equals("allProduits")){
                String order = request.getParameter("orderBy");
                if (order == null) {
                    order = "nom asc";
                }                
                Collection<jeu> listeJeu = gestionnaireJeu.getAllJeuxOrderBy(order);
                request.setAttribute("listeJeux", listeJeu);

                //A mettre à chaque fois
                Collection<categorie> liste = gestionnaireCategorie.getAllCategories();
                request.setAttribute("listeDesCategories", liste);
                request.setAttribute("nbArtPanier", nbProduitsPanier());
                request.setAttribute("totalPanier", totalPanier);
                request.setAttribute("titre", "Tous les produits");

                //redirection
                RequestDispatcher dp = request.getRequestDispatcher("index.jsp?action=allProduits");
                dp.forward(request, response);

            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
